package cloud.seri.iot.manager.domain

import com.fasterxml.jackson.annotation.JsonIgnoreProperties
import org.springframework.data.annotation.Id
import org.springframework.data.mongodb.core.mapping.DBRef
import org.springframework.data.mongodb.core.mapping.Document
import org.springframework.data.mongodb.core.mapping.Field
import java.time.Instant
import javax.persistence.Entity
import javax.validation.constraints.NotNull
import javax.validation.constraints.Size

/**
 * The Device entity.
 * @author A true hipster
 */
@Document(collection = "seri_device")
@Entity
class Device(
    /**
     * IotId
     */
    @Id
    var iotId: String? = null,

    /**
     * 设备名称
     */
    @get: NotNull
    @get: Size(min = 4, max = 32)
    @Field("device_name")
    var deviceName: String? = null,

    var nickname: String? = null,

    /**
     * 设备秘钥
     */
    @Field("device_secret")
    var deviceSecret: String? = null,

    /**
     * 激活时间
     */
    @Field("active_date")
    var activeDate: Instant? = null,

    /**
     * 最后在线时间
     */
    @Field("online_date")
    var onlineDate: Instant? = null,

    /**
     * 设备状态。取值：
     * ONLINE：设备在线。
     * OFFLINE：设备离线。
     * UNACTIVE：设备未激活。
     * DISABLE：设备已禁用。
     */
    @Field("status")
    var status: Int = 0,

    /**
     * 最后IP地址
     */
    @Field("ip_address")
    var ipAddress: String? = null,

    var coordinate: DoubleArray? = null,

    /**
     * 详细地址
     */
    @Field("address")
    var address: String? = null,

    /**
     * 货道数量
     */
    @Field("aisle_count")
    var aisleCount: Int = 1,

    /**
     * 货道
     */
    var aisles: MutableList<Aisle>? = null,

    /**
     * 设备的固件版本号。
     */
    @Field("firmware_version")
    var firmwareVersion: String? = null,

    @DBRef
    @Field("product")
    @JsonIgnoreProperties("devices")
    var product: Product? = null

) : AbstractAuditingEntity()
